package DataStorage;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.criterion.Restrictions;

import HibernateSQLite.java.model.Influence;

public class InfluenceDAOHibernate extends
		GenericDAOHibernate<Influence, Long, IInfluenceDAO> implements
		IInfluenceDAO {

	@SuppressWarnings("unchecked")
	public boolean isExist(String coupe, long InformationLigne_id) {
		try {
			List<Influence> list = getSession()
					.createCriteria(Influence.class)
					.add(Restrictions.eq("coupe", coupe))
					.add(Restrictions.eq("InformationLigne_id",
							InformationLigne_id)).list();

			if (!list.isEmpty()) {
				return true;
			}
		} catch (HibernateException e) {
			e.printStackTrace();
		} finally {
			this.closeSession();
		}
		return false;
	}

	@SuppressWarnings("unchecked")
	public boolean isExist(long influence_id) {
		try {
			List<Influence> list = getSession().createCriteria(Influence.class)
					.add(Restrictions.eq("influence_id", influence_id)).list();

			if (!list.isEmpty()) {
				return true;
			}
		} catch (HibernateException e) {
			e.printStackTrace();
		} finally {
			this.closeSession();
		}
		return false;
	}

	@SuppressWarnings("unchecked")
	public boolean isExistInformationLigne_id(long InformationLigne_id) {
		try {
			List<Influence> list = getSession()
					.createCriteria(Influence.class)
					.add(Restrictions.eq("InformationLigne_id",
							InformationLigne_id)).list();

			if (!list.isEmpty()) {
				return true;
			}
		} catch (HibernateException e) {
			e.printStackTrace();
		} finally {
			this.closeSession();
		}
		return false;
	}

	@SuppressWarnings("unchecked")
	public Influence getInfluence(String coupe, long InformationLigne_id) {
		try {
			List<Influence> list = getSession()
					.createCriteria(Influence.class)
					.add(Restrictions.eq("coupe", coupe))
					.add(Restrictions.eq("InformationLigne_id",
							InformationLigne_id)).list();
			for (Influence c : list) {
				return c;
			}
		} catch (HibernateException e) {
			e.printStackTrace();
		} finally {
			this.closeSession();
		}
		return null;
	}

	@SuppressWarnings("unchecked")
	public List<Influence> getListInfluence(long InformationLigne_id) {
		try {
			List<Influence> list = getSession()
					.createCriteria(Influence.class)
					.add(Restrictions.eq("InformationLigne_id",
							InformationLigne_id)).list();

			return list;
		} catch (HibernateException e) {
			e.printStackTrace();
		} finally {
			this.closeSession();
		}
		return null;

	}

	@Override
	public List<String> getListCoupe(long InformationLigne_id) {
		List<Influence> list = this.getListInfluence(InformationLigne_id);
		List<String> listCoupe = new ArrayList<String>();
		for (Influence i : list) {
			listCoupe.add(i.getCoupe());
		}
		return listCoupe;
	}

	@Override
	public List<String> getListInfluence_1(long InformationLigne_id) {
		List<Influence> list = this.getListInfluence(InformationLigne_id);
		List<String> listInfluence1 = new ArrayList<String>();
		for (Influence i : list) {
			listInfluence1.add(i.getOP_influence_1());
		}
		return listInfluence1;
	}

	@Override
	public List<String> getListInfluence_2(long InformationLigne_id) {
		List<Influence> list = this.getListInfluence(InformationLigne_id);
		List<String> listInfluence2 = new ArrayList<String>();
		for (Influence i : list) {
			listInfluence2.add(i.getOP_influence_2());
		}
		return listInfluence2;
	}

	@Override
	public List<String> getListVueByN_cordon(String N_cordon,
			long InformationLigne_id) {
		List<String> listVueThisCordon = new ArrayList<String>();
		List<String> listCoupe = this.getListCoupe(InformationLigne_id);

		if (listCoupe.contains(N_cordon + "D")) {
			listVueThisCordon.add(N_cordon + "D");
		}
		if (listCoupe.contains(N_cordon + "M")) {
			listVueThisCordon.add(N_cordon + "M");
		}
		if (listCoupe.contains(N_cordon + "F")) {
			listVueThisCordon.add(N_cordon + "F");
		}

		return listVueThisCordon;
	}

	@Override
	public int getNumberVueByN_cordon(String N_cordon, long InformationLigne_id) {
		return this.getListVueByN_cordon(N_cordon, InformationLigne_id).size();
	}

	@Override
	public void saveInfluence(List<String> coupes, List<String> OP_principal,
			List<String> influence_1, List<String> influence_2,
			long InformationLigne_id) {

		Influence influence = null;
		try {
			getSession();
			int sizeCoupe = coupes.size();
			int size_principal = OP_principal.size();
			int sizeInfluence_1 = influence_1.size();
			int sizeInfluence_2 = influence_2.size();

			// if (sizeCoupe == size_principal && sizeCoupe == sizeInfluence_1
			// &&
			// sizeCoupe == sizeInfluence_2) {
			String[] arr_coupe = (String[]) coupes
					.toArray(new String[sizeCoupe]);
			String[] arr_principal = (String[]) OP_principal
					.toArray(new String[size_principal]);
			String[] arr_influence_1 = (String[]) influence_1
					.toArray(new String[sizeInfluence_1]);
			String[] arr_influence_2 = (String[]) influence_2
					.toArray(new String[sizeInfluence_2]);

			for (int i = 0; i < sizeCoupe; i++) {
				if (!this.isExist(arr_coupe[i], InformationLigne_id)) {
					influence = new Influence();
					influence.setOP_principal(arr_principal[i]);
					influence.setCoupe(arr_coupe[i]);
					influence.setOP_influence_1(arr_influence_1[i]);
					influence.setOP_influence_2(arr_influence_2[i]);
					influence.setInformationLigne_id(InformationLigne_id);
					getSession().save(influence);
				}
			}
			this.commit();
		} catch (HibernateException e) {
			e.printStackTrace();
		} finally {
			this.closeSession();
		}
	}

	public void saveInfluence(List<Influence> listInfluence) {
		try{
			for (Influence influence : listInfluence) {
				if (!this.isExist(influence.getInfluence_id())) {
					influence.setOP_principal(influence.getOP_principal());
					influence.setCoupe(influence.getCoupe());
					influence.setOP_influence_1(influence.getOP_influence_1());
					influence.setOP_influence_2(influence.getOP_influence_2());
					influence.setInformationLigne_id(influence
							.getInformationLigne_id());
					getSession().save(influence);
				}
			}
			this.commit();
		} catch (HibernateException e) {
			e.printStackTrace();
		} finally {
			this.closeSession();
		}
	}

	public void deleteInfluences(long InformationLigne_id) {
		try{
			if (this.isExistInformationLigne_id(InformationLigne_id)) {
				List<Influence> listInfluence = getListInfluence(InformationLigne_id);
				this.deleAll(listInfluence);
			}
		}catch (HibernateException e) {
			e.printStackTrace();
		} finally {
			this.closeSession();
		}		
	}

	public static void main(String[] args) {

		long InformationLigne_id = 1;
		String coupe = "C10M";
		InfluenceDAOHibernate i = new InfluenceDAOHibernate();

		Influence influence = i.getInfluence(coupe, InformationLigne_id);
		System.out.println(influence.getOP_principal());
		
		if (influence.getOP_influence_2().equals("")) {
			System.out.println("null");
		} else {
			System.out.println("non null");
		}

	}

}
